Q: 動畫影片看起來卡卡的?
A: 請各位見諒,跑起來真真是順暢的呢!
上一篇的Slot效果以父層固定寬高後設置overflow: hidden
,同時子層設定animation讓元素位移至父層以外的範圍,以達到Slot的效果。本篇以相同的概念做出數字中,在數字跳動的時候,數字有替換的效果!本篇會有比較多的javascript
程式來操作元素內的文字,也以javascript
操控css的animation-play-state
來完成本次的實作。
首先將每個字元都以.clock-txt
包起來,並針對每個會顯示數字的元素添加id,記住id必須是唯一值!然後將.clock-txt
的父層.clock-item
以上一篇Slot的概念設置高度後設定overflow: hidden
。
<style>
.clock {
display: flex;
background-color: NavajoWhite;
}
.clock-item,
.clock-symbol {
display: flex;
margin: 5px;
width: 50px;
line-height: 70px;
font-size: 48px;
justify-content: center;
}
.clock-item {
background-color: FloralWhite;
border: 2px solid Chocolate;
border-radius: 10px;
box-shadow: 0 0 6px 1px SaddleBrown;
overflow: hidden;
}
</style>
<div class="clock is-active">
<div class="clock-item">
<div class="clock-txt" id="hour-1">-</div>
</div>
<div class="clock-item">
<div class="clock-txt" id="hour-2">-</div>
</div>
<div class="clock-symbol">
:
</div>
<div class="clock-item">
<div class="clock-txt" id="min-1">-</div>
</div>
<div class="clock-item">
<div class="clock-txt" id="min-2">-</div>
</div>
<div class="clock-symbol">
:
</div>
<div class="clock-item">
<div class="clock-txt" id="sec-1">-</div>
</div>
<div class="clock-item">
<div class="clock-txt" id="sec-2">-</div>
</div>
</div>
對子層的.clock-txt
下animation
讓元素位移,從 Y 軸的-100%位移到 Y 軸的100%,並設置時間為一秒,這時候基礎的動畫就完成了!
<style>
.is-active .clock-txt {
animation: clockSlide 1s infinite;
}
@keyframes clockSlide {
0% {
transform: translateY(-100%);
}
25%, 75% {
transform: translateY(0);
}
100% {
transform: translateY(100%);
}
}
</style>
setClock()
方法,以setInterval
每1000毫秒執行一次方法裡的程式。setInterval
內會new Date()
,就可以拿到當前的時間。date
丟到setTimeTxt(date)
內執行。setTimeTxt(date)
時,須將丟入date
參數。Math.floor
為無條件捨去法。 ex: Math.floor(38 / 10) ==> 3%
為取得商數。 ex: 12 % 10 ==> 2<script>
function setTimeTxt(date) {
document.getElementById('hour-1').innerText = Math.floor(date.getHours() / 10);
document.getElementById('hour-2').innerText = date.getHours() % 10;
document.getElementById('min-1').innerText = Math.floor(date.getMinutes() / 10);
document.getElementById('min-2').innerText = date.getMinutes() % 10;
document.getElementById('sec-1').innerText = Math.floor(date.getSeconds() / 10);
document.getElementById('sec-2').innerText = date.getSeconds() % 10;
}
function setClock() {
setInterval(() => {
const date = new Date();
setTimeTxt(date);
toggleAnimation(date);
}, 1000);
}
setClock();
</script>
透過上方的aniamtion
及javascript
,已經可以讓數字有動態效果,但本篇希望可以將「有變化的數字作移動」就好,這時候就可以以javascript
操控元素的樣式animation-play-state
,讓元素的animation
暫停,以下為設置元素的動畫paused
或running
的判斷。
setTimeout
250毫秒,方法內的程式會在250毫秒後才執行。#sec-1
為例,是設定秒鐘的十位數,在秒數%10
的商為9時才讓動畫演繹,不然都讓動畫暫停。<script>
function toggleAnimation(date) {
setTimeout(() => {
if (
(date.getHours() % 10 === 9 || date.getHours() === 23) &&
date.getMinutes() % 60 === 59 &&
date.getSeconds() % 60 === 59
) {
document.getElementById('hour-1').style.animationPlayState = "running"
} else {
document.getElementById('hour-1').style.animationPlayState = "paused"
}
if (date.getMinutes() % 60 === 59 && date.getSeconds() % 60 === 59) {
document.getElementById('hour-2').style.animationPlayState = "running"
} else {
document.getElementById('hour-2').style.animationPlayState = "paused"
}
if (date.getMinutes() % 10 === 9 && date.getSeconds() % 60 === 59) {
document.getElementById('min-1').style.animationPlayState = "running"
} else {
document.getElementById('min-1').style.animationPlayState = "paused"
}
if (date.getSeconds() % 60 === 59) {
document.getElementById('min-2').style.animationPlayState = "running"
} else {
document.getElementById('min-2').style.animationPlayState = "paused"
}
if (date.getSeconds() % 10 === 9) {
document.getElementById('sec-1').style.animationPlayState = "running"
} else {
document.getElementById('sec-1').style.animationPlayState = "paused"
}
}, 250);
}
</script>
所以~透過html、css、javascript的組合技並運用Slot動畫的概念,做出一款數字變化時有動畫的時鐘!
如果有寫錯的地方,歡迎點評! 會及時改進~
如果有更好的寫法,歡迎指教! 希望各位不吝賜教~
如果想看更多效果,歡迎敲碗! 提供示意圖小編寫寫看~
如果內容疑似侵權,拜託告知! 內容皆為小編理解後原創~
如果對你有點幫助,拿去用吧!